
/*
 * Hlpay-Plus aggregate payment system.
 * Copyright (c) 2024-2025 Hlpay Team Copyright has the right of final interpretation.
 */

package com.hlkj.pay.service.common.impl;

import java.util.List;

import org.springframework.stereotype.Service;

import com.hlkj.framework.common.pojo.PageResult;
import com.hlkj.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.hlkj.pay.common.constants.CommucationConstant;
import com.hlkj.pay.dto.common.TemplateQueryDto;
import com.hlkj.pay.enums.CommonEnum;
import com.hlkj.pay.infrastructure.mapper.common.TemplateMapper;
import com.hlkj.pay.infrastructure.model.common.TemplateDO;
import com.hlkj.pay.service.common.ITemplateService;
import com.hlkj.pay.util.TemplateCodeUtils;

import lombok.RequiredArgsConstructor;

/**
 * Description: 模板服务实现
 *
 * @author monk
 * @date 2023/3/23
 */
@Service
@RequiredArgsConstructor
public class TemplateServiceImpl implements ITemplateService {

    private final TemplateMapper templateMapper;

    @Override
    public PageResult<TemplateDO> queryPage(TemplateQueryDto queryDO) {
        LambdaQueryWrapperX<TemplateDO> queryWrapperX = buildWrapper(queryDO);
        return templateMapper.selectPage(queryDO, queryWrapperX);
    }

    @Override
    public List<TemplateDO> queryList(TemplateQueryDto queryDO) {
        return templateMapper.selectList(buildWrapper(queryDO));
    }

    @Override
    public TemplateDO detail(String templateCode) {
        TemplateQueryDto templateQueryDto = new TemplateQueryDto();
        templateQueryDto.setTemplateCode(templateCode);
        LambdaQueryWrapperX<TemplateDO> queryWrapperX = buildWrapper(templateQueryDto);
        queryWrapperX.last(CommucationConstant.LIMIT_ONE);
        TemplateDO templateDO = templateMapper.selectOne(queryWrapperX);
        return templateDO;
    }

    @Override
    public String addTemplate(TemplateDO templateDO) {
        TemplateDO selectOne = templateMapper.selectLatestOne();
        Long code = CommucationConstant.DEFALUT_TEMPLATE_ID;
        if (selectOne != null) {
            code = selectOne.getId();
        }
        String templateCode = TemplateCodeUtils.templateCode(code, templateDO.getTemplateType());
        templateDO.setTemplateCode(templateCode);
        templateMapper.insert(templateDO);
        return templateCode;
    }

    @Override
    public void updateTemplate(TemplateDO templateDO) {
        TemplateQueryDto templateQueryDto = new TemplateQueryDto();
        templateQueryDto.setTemplateCode(templateDO.getTemplateCode());
        templateMapper.update(templateDO, buildWrapper(templateQueryDto));
    }

    @Override
    public void deleteTemplate(String templateCode) {
        TemplateQueryDto templateQueryDto = new TemplateQueryDto();
        templateQueryDto.setTemplateCode(templateCode);
        templateMapper.delete(buildWrapper(templateQueryDto));
    }

    @Override
    public void statusUpdate(String templateCode, CommonEnum.TEMPLATE_STATUS templateStatus) {
        TemplateQueryDto templateQueryDto = new TemplateQueryDto();
        templateQueryDto.setTemplateCode(templateCode);
        TemplateDO templateDO = new TemplateDO();
        templateDO.setStatus(templateStatus.getCode());
        templateMapper.update(templateDO, buildWrapper(templateQueryDto));
    }

    private LambdaQueryWrapperX<TemplateDO> buildWrapper(TemplateQueryDto queryDO) {
        LambdaQueryWrapperX<TemplateDO> queryWrapperX = new LambdaQueryWrapperX<>();
        queryWrapperX.eqIfPresent(TemplateDO::getTemplateCode, queryDO.getTemplateCode());
        queryWrapperX.inIfPresent(TemplateDO::getTemplateCode, queryDO.getTemplateCodes());
        queryWrapperX.eqIfPresent(TemplateDO::getBusinessType, queryDO.getBusinessType());
        queryWrapperX.eqIfPresent(TemplateDO::getTemplateType, queryDO.getTemplateType());
        queryWrapperX.inIfPresent(TemplateDO::getTemplateType, queryDO.getTemplateTypes());
        queryWrapperX.eqIfPresent(TemplateDO::getStatus, queryDO.getStatus());
        queryWrapperX.eqIfPresent(TemplateDO::getId, queryDO.getId());
        queryWrapperX.eqIfPresent(TemplateDO::getTemplateName, queryDO.getTemplateName());
        queryWrapperX.likeIfPresent(TemplateDO::getTemplateName, queryDO.getTemplateLikeName());
        queryWrapperX.geIfPresent(TemplateDO::getCreateTime, queryDO.getStartSendTime());
        queryWrapperX.leIfPresent(TemplateDO::getCreateTime, queryDO.getEndSendTime());
        return queryWrapperX;
    }

}
